package com.wofish.goods.service.impl;

import com.fasterxml.jackson.core.type.TypeReference;
import com.google.common.collect.Maps;
import com.wofish.common.core.text.Convert;
import com.wofish.common.json.JsonUtil;
import com.wofish.common.utils.StringUtils;
import com.wofish.goods.domain.*;
import com.wofish.goods.dto.GoodsTypeDto;
import com.wofish.goods.mapper.GoodsTypeMapper;
import com.wofish.goods.service.*;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

/**
 * 商品类型 服务层实现
 * 
 * @author wofish
 * @date 2019-04-14
 */
@Service
public class GoodsTypeServiceImpl implements IGoodsTypeService 
{
	@Autowired
	private GoodsTypeMapper goodsTypeMapper;

	@Autowired
	private IGoodsTypePropsValueService goodsTypePropsValueService;

	@Autowired
	private IGoodsTypePropsService goodsTypePropsService;

	@Autowired
	private IGoodsTypeSpecService goodsTypeSpecService;

	@Autowired
	private ITypeBrandService typeBrandService;

	/**
     * 查询商品类型信息
     * 
     * @param typeId 商品类型ID
     * @return 商品类型信息
     */
    @Override
	public GoodsType selectGoodsTypeById(Long typeId)
	{
	    return goodsTypeMapper.selectGoodsTypeById(typeId);
	}
	
	/**
     * 查询商品类型列表
     * 
     * @param goodsType 商品类型信息
     * @return 商品类型集合
     */
	@Override
	public List<GoodsType> selectGoodsTypeList(GoodsType goodsType)
	{
	    return goodsTypeMapper.selectGoodsTypeList(goodsType);
	}
	
    /**
     * 新增商品类型
     * 
     * @param goodsType 商品类型信息
     * @return 结果
     */
	@Override
	public int insertGoodsType(GoodsType goodsType)
	{
	    return goodsTypeMapper.insertGoodsType(goodsType);
	}

	@Override
	public int addGoodsType(GoodsType goodsType, String typePropsJson, String[] brandIds,String[] specIds) {

		int row = insertGoodsType(goodsType);

		savePropsAndValues(typePropsJson, goodsType.getTypeId());

		//关联类型品牌
		saveTypeBrands(brandIds,goodsType.getTypeId());

		//关联类型规格
		saveTypeSpecs(specIds, goodsType.getTypeId());

		return row;
	}

	@Override
	public int editGoodsType(GoodsType goodsType, String typePropsJson, String[] brandIds,String[] specIds) {


		int row = updateGoodsType(goodsType);
		//先删除之前的扩展属性值，再批量保存
		goodsTypePropsService.deletePropsByTypeId(goodsType.getTypeId());

		savePropsAndValues(typePropsJson, goodsType.getTypeId());

		//删除之前关联的
		typeBrandService.deleteByTypeId(goodsType.getTypeId());

		//关联类型品牌
		saveTypeBrands(brandIds,goodsType.getTypeId());

		//先删除之前的规格关联，再批量保存
		goodsTypeSpecService.deleteTypeSpecByTypeId(goodsType.getTypeId());

		saveTypeSpecs(specIds, goodsType.getTypeId());

		return row;
	}


	private void savePropsAndValues(String typePropsJson, Long typeId) {
		if (StringUtils.isNotBlank(typePropsJson)) {
			List<GoodsTypeProps> typePropsList = JsonUtil.strToObj(typePropsJson, new TypeReference<List<GoodsTypeProps>>() {
			});
			if (CollectionUtils.isNotEmpty(typePropsList)) {
				Map<String, Integer> indexGoodsPMap = Maps.newHashMap(); // type -> goodsP
				for (GoodsTypeProps tp : typePropsList) {

					String type = tp.getType().split("_")[0];
					Integer goodsP = indexGoodsPMap.get(type);
					if (goodsP == null) {    // 初始化
						if ("select".equals(type)) {
							goodsP = 0;
						} else if ("input".equals(type)) {
							goodsP = 10;
						}
					}
					goodsP++;
					tp.setType(type);
					tp.setGoodsP(goodsP);
					indexGoodsPMap.put(type, goodsP);
				}

				for (GoodsTypeProps tp : typePropsList) {
					tp.setTypeId(typeId);    // typeId由上面保存了goodsType后获得
					goodsTypePropsService.insertGoodsTypeProps(tp);
					if (StringUtils.isNotBlank(tp.getTypePropValues())) {
						String[] propValues = tp.getTypePropValues().split(",");
						Date updateTime = new Date();
						GoodsTypePropsValue goodsTypePropsValue = null;
						List<GoodsTypePropsValue> propsValueList = new ArrayList<>();
						for (int i = 0; i < propValues.length; i++) {
							goodsTypePropsValue = new GoodsTypePropsValue();
							goodsTypePropsValue.setName(propValues[i]);
							goodsTypePropsValue.setPropsId(tp.getPropsId());
							goodsTypePropsValue.setUpdateTime(updateTime);
							goodsTypePropsValue.setOrderNum(i);
							propsValueList.add(goodsTypePropsValue);
						}
						goodsTypePropsValueService.insertBatchGoodsTypePropsValue(propsValueList);
					}
				}
			}
		}

	}


	public void saveTypeBrands(String[] brandIds, Long typeId){

		if (brandIds != null && brandIds.length > 0) {
			List<TypeBrand> list = new ArrayList<>();
			for (int i = 0; i < brandIds.length; i++) {
				TypeBrand typeBrand = new TypeBrand();
				typeBrand.setTypeId(typeId);
				typeBrand.setBrandOrder(i);
				typeBrand.setBrandId(Long.valueOf(brandIds[i]));
				list.add(typeBrand);
			}
			typeBrandService.insertBatchTypeBrand(list);
		}
	}

	private void saveTypeSpecs(String[] specIds, Long typeId) {
		//关联类型规格
		if (specIds != null && specIds.length > 0) {
			List<GoodsTypeSpec> goodsTypeSpecList = new ArrayList<>();
			for (int i = 0; i < specIds.length; i++) {
				GoodsTypeSpec goodsTypeSpec = new GoodsTypeSpec();
				goodsTypeSpec.setOrderNum(i);
				goodsTypeSpec.setSpecStyle(0);
				goodsTypeSpec.setTypeId(typeId);
				goodsTypeSpec.setSpecId(Long.valueOf(specIds[i]));
				goodsTypeSpecList.add(goodsTypeSpec);
			}
			goodsTypeSpecService.insertBatchGoodsTypeSpec(goodsTypeSpecList);
		}

	}

	/**
     * 修改商品类型
     * 
     * @param goodsType 商品类型信息
     * @return 结果
     */
	@Override
	public int updateGoodsType(GoodsType goodsType)
	{
	    return goodsTypeMapper.updateGoodsType(goodsType);
	}

	/**
     * 删除商品类型对象
     * 
     * @param ids 需要删除的数据ID
     * @return 结果
     */
	@Override
	public int deleteGoodsTypeByIds(String ids)
	{
		return goodsTypeMapper.deleteGoodsTypeByIds(Convert.toStrArray(ids));
	}

	@Override
	public List<GoodsTypeDto> listGoodsType() {
		return goodsTypeMapper.listGoodsType();
	}
}
